package com.unionpay.upyzt.example;

import com.unionpay.upyzt.Upyzt;
import com.unionpay.upyzt.exception.UpyztException;
import com.unionpay.upyzt.model.BalanceAcct;
import com.unionpay.upyzt.model.BalanceAcctFreeze;
import com.unionpay.upyzt.model.BalanceTransaction;
import com.unionpay.upyzt.resp.*;
import com.unionpay.upyzt.util.StringUtils;

import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.Map;

public class BalanceAcctExample {

    /**
     * 个人用户号（与 mchId 二选一）
     */
    private final String cusId;

    /**
     * 二级商户号（与 cusId 二选一）
     */
    private final String mchId;

    public BalanceAcctExample(String cusId, String mchId) {
        this.cusId = cusId;
        this.mchId = mchId;
    }

    /**
     * 运行 Demos
     *
     * @param cusId 个人用户号（与 mchId 二选一）
     * @param mchId 二级商户号（与 cusId 二选一）
     */
    public static void runDemos(String cusId, String mchId) throws UpyztException {
        BalanceAcctExample balanceAcctExample = new BalanceAcctExample(cusId, mchId);

        // 新增电子账簿
        BalanceAcctStoreResp balanceAcctStoreResp = balanceAcctExample.create();

        // 电子账簿查询（电子账簿ID）
        BalanceAcctResp balanceAcctResp = balanceAcctExample.retrieveById(balanceAcctStoreResp.getBalanceAcctId());

        // 电子账簿查询（用户ID）
        BalanceAcctListResp balanceAcctListResp = balanceAcctExample.retrieveByUserId();

        // 冻结/解冻电子账簿
        BalanceAcctFreezeResp balanceAcctFreezeResp = balanceAcctExample.freeze(balanceAcctResp.getBalanceAcctId());

        // 冻结/解冻结果查询（系统订单号）
        balanceAcctFreezeResp = balanceAcctExample.retrieveFreezeById(balanceAcctFreezeResp.getBalanceAcctFreezeId());

        // 冻结/解冻结果查询（平台订单号）
        balanceAcctFreezeResp = balanceAcctExample.retrieveFreezeByOutRequestNo(balanceAcctFreezeResp.getOutRequestNo());

        // 电子账簿流水查询
        BalanceTxnPaginationResp balanceTxnPaginationResp = balanceAcctExample.page(balanceAcctResp.getBalanceAcctId());

        // 注销电子账簿
        BalanceAcctDeleteResp balanceAcctDeleteResp = balanceAcctExample.removeById(balanceAcctResp.getBalanceAcctId());
    }

    /**
     * 新增电子账簿
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctStoreResp create() throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        params.put("out_request_no", Main.generateRandomOutNo());
        if (!StringUtils.isBlank(cusId)) {
            params.put("cus_id", cusId);
        }
        if (!StringUtils.isBlank(mchId)) {
            params.put("mch_id", mchId);
        }
        params.put("password", Upyzt.encryptField("pa55w0rd"));
        params.put("remark", "用于 SDK 示例测试");

        System.out.println("------- 新增电子账簿 -------");
        BalanceAcctStoreResp resp = BalanceAcct.create(params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 电子账簿查询（电子账簿ID）
     *
     * @param id 绑定账户编号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctResp retrieveById(String id) throws UpyztException {
        System.out.println("------- 电子账簿查询（电子账簿ID） -------");
        BalanceAcctResp resp = BalanceAcct.retrieveById(id);
        System.out.println(resp);
        return resp;
    }


    /**
     * 电子账簿查询（用户ID）
     *
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctListResp retrieveByUserId() throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        if (!StringUtils.isBlank(cusId)) {
            params.put("cus_id", cusId);
        }
        if (!StringUtils.isBlank(mchId)) {
            params.put("mch_id", mchId);
        }
        System.out.println("------- 电子账簿查询（用户ID） -------");
        BalanceAcctListResp resp = BalanceAcct.retrieveByUserId(params);
        System.out.println(resp);
        return resp;
    }


    /**
     * 冻结/解冻电子账簿
     *
     * @param balanceAcctId 电子账簿ID
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctFreezeResp freeze(String balanceAcctId) throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        params.put("out_request_no", Main.generateRandomOutNo());
        params.put("balance_acct_id", balanceAcctId);
        params.put("freeze", true);
        params.put("remark", "用于 SDK 示例测试");

        System.out.println("------- 冻结/解冻电子账簿 -------");
        BalanceAcctFreezeResp resp = BalanceAcctFreeze.create(params);
        System.out.println(resp);
        return resp;
    }

    /**
     * 冻结/解冻结果查询（系统订单号）
     *
     * @param id 电子账簿ID
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctFreezeResp retrieveFreezeById(String id) throws UpyztException {
        System.out.println("------- 冻结/解冻结果查询（系统订单号） -------");
        BalanceAcctFreezeResp resp = BalanceAcctFreeze.retrieveById(id);
        System.out.println(resp);
        return resp;
    }


    /**
     * 冻结/解冻结果查询（平台订单号）
     *
     * @param outRequestNo 平台订单号
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctFreezeResp retrieveFreezeByOutRequestNo(String outRequestNo) throws UpyztException {
        System.out.println("------- 冻结/解冻结果查询（平台订单号） -------");
        BalanceAcctFreezeResp resp = BalanceAcctFreeze.retrieveByOutRequestNo(outRequestNo);
        System.out.println(resp);
        return resp;
    }


    /**
     * 注销电子账簿
     *
     * @param id 电子账簿ID
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceAcctDeleteResp removeById(String id) throws UpyztException {
        System.out.println("------- 注销电子账簿 -------");
        BalanceAcctDeleteResp resp = BalanceAcct.removeById(id);
        System.out.println(resp);
        return resp;
    }


    /**
     * 电子账簿流水查询
     *
     * @param id 电子账簿ID
     * @return 返回参数
     * @throws UpyztException 异常
     */
    public BalanceTxnPaginationResp page(String id) throws UpyztException {
        Map<String, Object> params = new HashMap<>();
        params.put("balance_acct_id", id);
        params.put("start_at", OffsetDateTime.now().toString());
        System.out.println("------- 电子账簿流水查询 -------");
        BalanceTxnPaginationResp resp = BalanceTransaction.page(params);
        System.out.println(resp);
        return resp;
    }

}
